home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / Libraries / PlayerPRO 4.4.1 / Filters Plugs / CrossFade.c < prev    next >
C/C++ Source or Header  |  1995-04-16  |  3KB  |  107 lines

  1. /*    CrossFade        */
  2. /*    v 0.3            */
  3. /*    1995 by Liane    */
  4.  
  5. //    Usage:
  6. //    After setting a not-so-bad loop, do loop-to-selection
  7. //    then crossfade. It will remove the click that might
  8. //    appear at the end of the loop, and also linearize
  9. //    the harmonic content in it.
  10.  
  11. #include "MAD.h"
  12. #include "PPPlug.h"
  13.  
  14. #if defined(powerc) || defined(__powerc)
  15. enum {
  16.         PlayerPROPlug = kCStackBased
  17.         | RESULT_SIZE(SIZE_CODE( sizeof(OSErr)))
  18.         | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof( Ptr*)))
  19.         | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof( struct FileInstrData*)))
  20.         | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof( long)))
  21.         | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof( long)))
  22.         | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof( PPInfoPlug*)))
  23. };
  24.  
  25. ProcInfoType __procinfo = PlayerPROPlug;
  26. #else
  27. #include <A4Stuff.h>
  28. #endif
  29.  
  30.  
  31. #define min(a,b) (((a) < (b)) ? (a) : (b))
  32.  
  33. OSErr main(     Ptr                        *InstrumentPtr,
  34.                 struct FileInstrData    *theData,
  35.                 long                    SelectionStart,
  36.                 long                    SelectionEnd,
  37.                 PPInfoPlug                *thePPInfoPlug)
  38. {
  39.     switch( theData->amplitude)
  40.     {
  41.         case 8:
  42.         {
  43.             long    i, j, length = (SelectionEnd - SelectionStart) / 2;
  44.             long    temp, tempStart, tempEnd;
  45.             Ptr        StartPtr, EndPtr;
  46.         
  47.             length = min (length, theData->insSize - SelectionEnd);
  48.             length = min (length, SelectionStart);
  49.             length *= 2;
  50.             
  51.             for( j = 0; j < 2; j++)    //do it twice
  52.             {
  53.                 StartPtr = *InstrumentPtr + SelectionStart - (length / 2);
  54.                 EndPtr = *InstrumentPtr + SelectionEnd - (length / 2);
  55.                 for( i = 0; i < length; i++)
  56.                 {
  57.                     tempStart = *StartPtr;
  58.                     tempEnd = *EndPtr;
  59.             
  60.                     temp = ((tempEnd * i) + (tempStart * (length - i))) / length;
  61.                     if( temp > 127) temp = 127;
  62.                     else if( temp < -127 ) temp = -127;
  63.                     *StartPtr++ = temp;
  64.             
  65.                     temp = ((tempStart * i) + (tempEnd * (length - i))) / length;
  66.                     if( temp > 127) temp = 127;
  67.                     else if( temp < -127 ) temp = -127;
  68.                     *EndPtr++ = temp;
  69.                 }
  70.             }
  71.         } break;
  72.  
  73.         case 16:
  74.         {
  75.             long    i, j, length = (SelectionEnd - SelectionStart) / 2;
  76.             long    temp, tempStart, tempEnd;
  77.             short    *StartPtr, *EndPtr;
  78.         
  79.             length = min (length, theData->insSize - SelectionEnd);
  80.             length = min (length, SelectionStart);
  81. //            length *= 2;
  82.             
  83.             for( j = 0; j < 2; j++)    //do it twice
  84.             {
  85.                 StartPtr = (short*) *InstrumentPtr + (SelectionStart / 2) - (length / 2);
  86.                 EndPtr = (short*) *InstrumentPtr + (SelectionEnd / 2) - (length / 2);
  87.                 for( i = 0; i < length; i++)
  88.                 {
  89.                     tempStart = *StartPtr;
  90.                     tempEnd = *EndPtr;
  91.             
  92.                     temp = ((tempEnd * i) + (tempStart * (length - i))) / length;
  93.                     if( temp >= (short)0x7FFF) temp = 0x7FFF;    // overflow ?
  94.                     else if( temp <= (short)0x8000 ) temp = (short)0x8000;
  95.                     *StartPtr++ = temp;
  96.             
  97.                     temp = ((tempStart * i) + (tempEnd * (length - i))) / length;
  98.                     if( temp >= (short)0x7FFF) temp = 0x7FFF;    // overflow ?
  99.                     else if( temp <= (short)0x8000 ) temp = (short)0x8000;
  100.                     *EndPtr++ = temp;
  101.                 }
  102.             }
  103.         } break;
  104.     }
  105.     
  106.     return noErr;
  107. }